
"""
我们为了减少客户端和服务端的交互
①先把redis数据一次（2条指令）获取到
抽象问题具体化
②合并
    以redis为主，redis的数据保持不怎么动
    如果cookie中有的数据，redis中没有，则可以添加
    如果cookie中有的数据，redis中有，则数量以cookie为主

1、获取cookie信息
2、获取redis信息
3、做一个数据合并前的初始化，定义2个变量
    一个是接收redis数据，另外一个是记录选中的id
4、对cookie数据进行遍历，合并到redis中
5、将合并之后的数据 保存到redis中
6、合并之后cookie 数据要删除



"""
import pickle

import base64
from django_redis import get_redis_connection


def merge_cookie_to_redis(request,user,response):

    # 1、获取cookie信息
    cookie_str = request.COOKIES.get('cart')
    if cookie_str is not None:
        #说明有cart数据，对cart数据进行解密
        cookie_cart = pickle.loads(base64.b64decode(cookie_str))
        #  {1:{count:10,selected:True},3:{count:10,selected:True}}

        # 2、获取redis信息
        redis_conn = get_redis_connection('cart')
        sku_id_counts = redis_conn.hgetall('cart_%s'%user.id)

        # 3、做一个数据合并前的初始化，定义2个变量
        #     一个是接收redis数据，另外一个是记录选中的id
        selected_ids = []
        #对redis数据进行转换
        redis_count_ids = {}

        for sku_id,count in sku_id_counts.items():
            redis_count_ids[int(sku_id)]=int(count)

        # 4、对cookie数据进行遍历，合并到redis中
        for sku_id,count_selected in cookie_cart.items():
            if sku_id in redis_count_ids:
                #商品id 和 redis的id重复，重复的id，个数以cookie为主
                redis_count_ids[sku_id]=count_selected['count']
            else:
                redis_count_ids[sku_id]=count_selected['count']

            #把选中的状态获取出来
            if count_selected['selected']:
                selected_ids.append(sku_id)

        # 5、将合并之后的数据 保存到redis中
        #保存多个hash数据
        redis_conn.hmset('cart_%s'%user.id,redis_count_ids)
        #保存set数据
        redis_conn.sadd('cart_selected_%s'%user.id,*selected_ids)
        # 6、合并之后cookie 数据要删除
        response.delete_cookie('cart')

        return response
    else:
        return response





































































